package $2_1oo;

public class ActionScopeFunction {

    public static void main(String[] args) {
        // action scope 作用域
        // 在Java中，我们经常看到public、protected、private这些修饰符。在Java中，这些修饰符可以用来限定访问作用域。
        
        //  public
        //  定义为public的class、interface可以被其他任何类访问
        //  定义为public的field、method可以被其他类访问，前提是首先有访问class的权限
        
        
        //  private
        //  定义为private的field、method无法被其他类访问
        //  确切地说，private访问权限被限定在class的内部，而且与方法声明顺序无关。
        //      推荐把private方法放到后面，因为public方法定义了类对外提供的功能，阅读代码的时候，应该先关注public方法
        //  由于Java支持嵌套类，如果一个类内部还定义了嵌套类，那么，嵌套类拥有访问private的权限
        
        Inner i = new Inner();
        i.hi();
        
        //  protected
        //  protected作用于继承关系。定义为protected的字段和方法可以被子类访问，以及子类的子类
        //  包作用域是指一个类允许访问同一个package的没有public、private修饰的class，以及没有public、protected、private修饰的字段和方法。
        //  只要在同一个包，就可以访问package权限的class、field和method
        
        //  局部变量
        //  在方法内部定义的变量称为局部变量，局部变量作用域从变量声明处开始到对应的块结束。方法参数也是局部变量。
        
        //  final
        //  Java还提供了一个final修饰符。final与访问权限不冲突，它有很多作用。
        //  用final修饰class可以阻止被继承
        //  用final修饰method可以阻止被子类覆写
        //  用final修饰field可以阻止被重新赋值
        //  用final修饰局部变量可以阻止被重新赋值
        
        //  最佳实践
        //  如果不确定是否需要public，就不声明为public，即尽可能少地暴露对外的字段和方法。
        //  把方法定义为package权限有助于测试，因为测试类和被测试类只要位于同一个package，测试代码就可以访问被测试类的package权限方法。
        //  一个.java文件只能包含一个public类，但可以包含多个非public类。如果有public类，文件名必须和public类的名字相同。
        

    }
    
    public class Hellopublic {
        public void hi() {
            
        }
    }
    
    // private方法:
    private static void helloprivate() {
        System.out.println("private hello!");
    }

    // 静态内部类:
    static class Inner {
        public void hi() {
            ActionScopeFunction.helloprivate();
        }
    }
}



